
package Rechercher;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.ws.WebServiceRef;
import Webservices.DocumentServiceService;
import Webservices.IOException_Exception;

/**
 * Servlet pour rechercher un document XML.
 * @author Valentin & David.
 */
@WebServlet(name = "RechercherXML", urlPatterns = {"/rechercherXML"})
public class RechercherXML extends HttpServlet {
    @WebServiceRef(wsdlLocation = "WEB-INF/wsdl/DocumentServiceService.wsdl")
    private DocumentServiceService service;
    
    
    /**
     * Fonction pour récupérer (POST) les paramètres de la page web.
     * <code>POST</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        
        PrintWriter out = response.getWriter();
        
        // On récupère l'ensemble des mots clés sous forme de chaine de caracteres.
        String param = request.getParameter("v_tableauMotCle");
        // On récupère le type de recherche (et/ou).
        String typeRecherche = request.getParameter("v_typeRecherche");
        // On split la chaine pour la mettre dans un tableau.
        String[] tab = param.split(",");
        //Convertion du tableau de string pour le passer dans le WS.
        List<String> lstMotCle = Arrays.asList(tab);
        
        // On récupère le résultat avec les paramètres instanciés ci-dessus.
        String resultat = "";
        try {
            resultat = rechercheDocument(lstMotCle, typeRecherche);
        } catch (Exception ex) {
            Logger.getLogger(RechercherXML.class.getName()).log(Level.SEVERE, null, ex);
        }
        
        /**
         * Le web service nous renvois une chaine de type :
         * id:titre;id:titre;...
         * C'est pour cette raison que nous allons spliter la chaine à chaque ";",
         * puis pour chaque sous chaine re-spliter à chaque ":" pour former un objet de type Article.
         */
        ArrayList<Article> lstResult;
        if(!resultat.equals("")){
            String[] tabResult = resultat.split(";");
            Article article;
            lstResult = new ArrayList<>();
            for(String petiteChaine : tabResult){
                String[] objet = petiteChaine.split(":");
                article = new Article();
                article.setId(objet[0]);
                article.setTitre(objet[1]);
                lstResult.add(article);
            }
        }else {
            lstResult = new ArrayList<>();
        }
        
        // Nous ajoutons la liste des résultats aux attributs de retour afin de les afficher sur la page de résultats.
        request.setAttribute("articles", lstResult);
        // On redirige vers la page resultRechercher.jsp.
        request.getRequestDispatcher("/resultRechercher.jsp").forward(request, response);
    }
    
    /**
     * Fonction du web service.
     * @param arg0 : Liste des mots clés recherchés.
     * @param arg1 : Type de recherche.
     * @return
     * @throws IOException_Exception
     */
    private String rechercheDocument(java.util.List<java.lang.String> arg0, java.lang.String arg1) throws IOException_Exception {
        Webservices.DocumentService port = service.getDocumentServicePort();
        return port.rechercheDocument(arg0, arg1);
    }
}
